﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Bussiness;
using Data;

namespace hostal
{
    public partial class EditarHospedajeHabitacion : Form
    {
        string numeroHabitacion,numeroHabitacionAntigua,fechaRegistro,fechaLlegada,fechaRegistroActual;
        bool click = false;
        bool fechaIngresoIncorrecto, fechaSalidaIncorrecto = true;
        private manejadorFechas fechas = new manejadorFechas();
        public List<string> coleccionHabitacionesDisponibles { get; set; }
        public List<string> coleccionCapacidadHabitacionesDisponibles { get; set; }
        public List<string> coleccionClientesHospedados=new List<string>();
        private manejadorReservas habitacionesDisponibles = new manejadorReservas();
        private bool registro = false;

        public EditarHospedajeHabitacion(DataTable dataTableTemporal,string numeroHabitacion)
        {
            InitializeComponent();

            this.numeroHabitacion = numeroHabitacion;
            this.numeroHabitacionAntigua = numeroHabitacion;
            dg.DataSource = dataTableTemporal;
            LBHabitacionAntiguas.Text += numeroHabitacion;
            this.fechaRegistro = dg.Rows[0].Cells["fechaRegistro"].Value.ToString();
            this.fechaLlegada = dg.Rows[0].Cells["fechaLlegada"].Value.ToString();
            fechaRegistroActual = fechas.crearFechaActual();
            DTFechaIngreso.Text = fechaLlegada;
            DTFechaSalida.Text = dg.Rows[0].Cells["fechaSalida"].Value.ToString();

            DGHabitacionesDisponibles.Columns.Add("numero", "numero habitacion");
            DGHabitacionesDisponibles.Columns.Add("tipo", "tipo");
            DGHabitacionesDisponibles.Columns.Add("capacidad", "capacidad");
            DGCliente.Columns.Add("numeroDocumento", "numero documento");
            DGCliente.Columns.Add("nombre", "nombre");
            DGCliente.Columns.Add("apellido", "apellido");

            HospedajeDataAccess cancelarReserva = new HospedajeDataAccess();
            cancelarReserva.cancelarHospedajeNumeroHabitacion(numeroHabitacion);

            for (int i = 0; i < dg.RowCount; i++)
            {
                DGCliente.Rows.Add(dg.Rows[i].Cells["numeroDocumento"].Value.ToString(), dg.Rows[i].Cells["nombre"].Value.ToString(), dg.Rows[i].Cells["apellido"].Value.ToString());
                coleccionClientesHospedados.Add(dg.Rows[i].Cells["numeroDocumento"].Value.ToString());
            }

            habitacionDataAccess habitaciones = new habitacionDataAccess();
            dataTableTemporal = habitaciones.buscartipoHabitaciones();
            dg.DataSource = dataTableTemporal;
            for (int i = 0; i < dg.RowCount; i++)
            {
                CBTipoHabitacion.Items.Add(dg.Rows[i].Cells["tipo"].Value);
            }

            habitacionDataAccess obtenerTipo = new habitacionDataAccess();
            dataTableTemporal=obtenerTipo.obtenerTipoHabitacion(numeroHabitacion);
            dg.DataSource = dataTableTemporal;
            CBTipoHabitacion.Text = dg.Rows[0].Cells["tipo"].Value.ToString();

            llenarGridHabitacionesDisponibles(fechaRegistro, fechaRegistro);

            DGHabitacionesDisponibles.ClearSelection();
            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; i++)
            {
                if (DGHabitacionesDisponibles.Rows[i].Cells["numero"].Value.ToString() == numeroHabitacion)
                    DGHabitacionesDisponibles.Rows[i].Cells["numero"].Selected = true;
            }

        }

        private void llenarGridHabitacionesDisponibles(string fechaIngreso, string fechaSalida)
        {
            coleccionHabitacionesDisponibles = habitacionesDisponibles.obtenerHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            coleccionCapacidadHabitacionesDisponibles = habitacionesDisponibles.obtenerCapacidadHabitacionesDisponibles(fechaIngreso, fechaSalida, CBTipoHabitacion.Text);
            
            for (int i = 0; i < DGHabitacionesDisponibles.Rows.Count; )
            {
                DGHabitacionesDisponibles.Rows.Remove(DGHabitacionesDisponibles.Rows[0]);
            }
            for (int i = 0; i < coleccionHabitacionesDisponibles.Count(); i++)
            {
                DGHabitacionesDisponibles.Rows.Add(coleccionHabitacionesDisponibles[i], CBTipoHabitacion.Text, coleccionCapacidadHabitacionesDisponibles[i]);
            }
        }

        private void TBBuscarHabitacionesDisponibles_Click(object sender, EventArgs e)
        {
            if (DTFechaIngreso.Value.Date <= DTFechaSalida.Value.Date)
                llenarGridHabitacionesDisponibles(DTFechaIngreso.Text, DTFechaSalida.Text);
            /*else
                MessageBox.Show("La fecha de salida no puede ser menor a la de ingreso");*/
        }

        private void BTBuscarCliente_Click(object sender, EventArgs e)
        {
            BuscarClienteReserva buscarClienteReserva = new BuscarClienteReserva();
            bool registrar = false;
            if (buscarClienteReserva.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < DGCliente.Rows.Count; i++)
                {
                    if (registrar = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString() == buscarClienteReserva.numeroDocumento)
                        i = DGCliente.Rows.Count;
                }
                if (!registrar)
                    DGCliente.Rows.Add(buscarClienteReserva.numeroDocumento, buscarClienteReserva.nombre, buscarClienteReserva.apellido);
            }
        }

        private void BTAgregarHuesped_Click(object sender, EventArgs e)
        {
            registarCliente registrarClienteReserva = new registarCliente();
            registrarClienteReserva.ShowDialog();
        }

        private void BTEliminarHuesped_Click(object sender, EventArgs e)
        {
            try
            {
                DGCliente.Rows.Remove(DGCliente.CurrentRow);
            }
            catch (Exception exp) { }
        }

        private void BTFinalizar_Click(object sender, EventArgs e)
        {
            if (fechaIngresoIncorrecto = DTFechaIngreso.Value > System.DateTime.Today.Date)
                EPFechaIngreso.SetError(DTFechaIngreso, "La fecha de ingreso no puede ser menor a la actual");
            else
                EPFechaIngreso.Clear();
            if (fechaSalidaIncorrecto = DTFechaIngreso.Value > DTFechaSalida.Value)
                EPFechaSalida.SetError(DTFechaSalida, "La fecha de salida no puede ser menor a la ingreso");
            else
                EPFechaSalida.Clear();
            if (!fechaSalidaIncorrecto && !fechaIngresoIncorrecto)
            {
                HospedajeDataAccess hospedaje = new HospedajeDataAccess();
                ConsumoDataAccess consumo = new ConsumoDataAccess();

                string numeroDocumento;
                try
                {
                    int fila;
                    fila = DGCliente.CurrentRow.Index;

                    fila = DGHabitacionesDisponibles.CurrentRow.Index;
                    numeroHabitacion = DGHabitacionesDisponibles.Rows[fila].Cells["numero"].Value.ToString();

                    for (int i = 0; i < DGCliente.Rows.Count; i++)
                    {
                        numeroDocumento = DGCliente.Rows[i].Cells["numeroDocumento"].Value.ToString();
                        if (!hospedaje.existeHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, fechaRegistro))
                            hospedaje.registrarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistroActual);
                        else
                            hospedaje.activarHospedaje(numeroDocumento, numeroHabitacion, DTFechaIngreso.Text, DTFechaSalida.Text, fechaRegistro, fechaRegistro);
                    }
                    MessageBox.Show("Exito Al Registrar");
                    registro = true;

                    consumo.actualizarConsumo(numeroHabitacionAntigua, numeroHabitacion);

                    this.Close();
                }
                catch (SystemException exeption)
                {
                    if (DGCliente.Rows.Count == 0)
                        MessageBox.Show("Debe existir al menos una persona parta registrar");
                    else
                        MessageBox.Show("No se Registro Con Exito");
                }
            }
        }

        private void BTAtras_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void EditarHospedajeHabitacion_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (!registro)
                {
                    for (int i = 0; i < coleccionClientesHospedados.Count; i++)
                    {
                        HospedajeDataAccess habilitarHospedaje = new HospedajeDataAccess();
                        habilitarHospedaje.habilitarHospedaje(numeroHabitacion, coleccionClientesHospedados[i], fechaLlegada);
                    }
                }
            }
            catch (Exception exp) { }
        }

        private void DTFechaIngreso_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_ValueChanged(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectedValueChanged(object sender, EventArgs e)
        {
            if(click)
                TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaIngreso_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void DTFechaSalida_CloseUp(object sender, EventArgs e)
        {
            TBBuscarHabitacionesDisponibles_Click(sender, e);
        }

        private void CBTipoHabitacion_SelectionChangeCommitted(object sender, EventArgs e)
        {
            click = true;
        }

        private void CBTipoHabitacion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }
    }
}
